package org.dromara.common.core.utils;

import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.function.BranchHandleFunction;
import org.dromara.common.core.function.ExceptionFunction;
import org.dromara.common.core.function.NullHandleFunction;
import org.springframework.util.ObjectUtils;

/**
 * 判断 工具类(函数式编程替代 if else)
 *
 * @author zlj
 * @since 2023/1/10
 */
@Slf4j
public class JudgeUtils {

	/**
	 * 异常处理:  条件成立  抛异常
	 *
	 * @param b 判断条件
	 * @return 抛异常, 并指定异常信息  com.huigu.common.function.ExceptionFunction
	 */
	public static ExceptionFunction conditionException(Boolean b) {
		return (msg, errLag) -> {
			if (b) {
                JudgeUtils.conditionNull(errLag).notNullHandle(t -> log.error(errLag));
                JudgeUtils.conditionNull(msg).notNullHandle(t -> {
					throw new ServiceException(msg);
				});
			}
		};
	}

	/**
	 * 分支处理:  根据条件分别执行逻辑
	 *
	 * @param b 判断条件
	 * @return com.huigu.common.function.BranchHandleFunction
	 */
	public static BranchHandleFunction conditionBranch(Boolean b) {
		return (trueBranch, falseBranch) -> {
			if (b) {
				trueBranch.run();
			} else {
				falseBranch.run();
			}
		};
	}

	/**
	 * 判空处理:  判断对象是否为空/空字符串/空集合
	 *
	 * @param obj
	 * @return
	 */
	public static <T> NullHandleFunction<T> conditionNull(T obj) {
		return (notNull, isNull) -> {
			if (ObjectUtils.isEmpty(obj)) {
				isNull.accept(obj);
			} else {
				notNull.accept(obj);
			}
		};
	}
}
